/*
 * meituan.com Inc.
 * Copyright (c) 2010-2018 All Rights Reserved.
 */
package item15;

import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

/**
 * <p>
 *
 * </p>
 * @author LvJing
 * @version $Id:BinaryOneCount.java v1.0 2018/7/15 上午12:18 LvJing Exp $
 */
public class BinaryOneCount {

    private Solution solution;

    @Before
    public void init() {
        solution = new Solution();
    }

    /**
     * 特殊输入
     */
    @Test
    public void test01() {
        Assert.assertEquals(0, solution.NumberOf1(0));
    }

    /**
     * 边界测试：该数为负数
     */
    @Test
    public void test02() {
        Assert.assertEquals(3, solution.NumberOf1(-3));
    }

    /**
     * 边界测试：该数为0
     */
    @Test
    public void test03() {
        Assert.assertEquals(0, solution.NumberOf1(0));
    }

    /**
     * 功能性测试：该数是正数
     */
    @Test
    public void test04() {
        Assert.assertEquals(3, solution.NumberOf1(7));
    }
}

/**
 * 面试题15：二进制中1的个数
 * 思路：按照二进制运算的特性，把一个数与上1，如果该数的二进制最右边是1，则与的结果为1，否则为0，与完后把该数右移一位，又进行判断。
 * 但是这种思路存在一个问题，当该数是负数时，右移的过程始终不会完，因为它的二进制最左边一直是1，所以可以换一个思路，如果要求的是负数，
 * 先把它转成正数在进行判断。
 */
class Solution {

    int NumberOf1(int n) {
        int count = 0;
        if (n == 0)
            return 0;
        if (n < 0) {
            n = -n;
            count++;
        }

        while (n != 0) {
            if ((n & 1) == 1) {
                count++;
                n = n >> 1;
            }
        }
        return count;
    }
}
